perm filename SETUP.SAI[4,KMC] blob
sn#177258 filedate 1975-09-17 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 BEGIN "SETUP"
C00006 00003 BEGIN
C00008 00004 PROC PLACE
C00009 00005 INTEGER PROC WRITE(STRING FILE)
C00011 00006 PROC DUMP
C00013 00007 PROC DSKLOC(STRING IFILE,OFILE)
C00014 00008 OUTSTR("WHICH TABLES DO YOU WANT CONSTRUCTED?" ↓)
C00016 ENDMK
C⊗;
BEGIN "SETUP"
REQUIRE "IODEFS.SAI[SEC,RCP]" SOURCE_FILE;
DEFINE MAXLEN= "10";
LABEL EXIT;
INTEGER J,P,VAL,TOTAL,SUBTOT;
BOOLEAN TRACE;
PRELOAD_WITH [5]FALSE;
BOOLEAN ARRAY TASK[1:5];
STRING S,T,F,V;
STRING SYNINP,SYNOUT,SPTINP,SPTOUT,CPTINP,CPTOUT,EXCOUT,DLKINP,DLKOUT;
PRELOAD_WITH 2000,3000,2000,1500,500,400,100,100,10,10;
INTEGER ARRAY LEN[1:MAXLEN];
INTEGER ARRAY COUNT[1:MAXLEN],PATTERN[1:MAXLEN];
TOTAL← 0;
OUTSTR("THE CURRENT PATTERN TABLE ALLOCATIONS ARE THE FOLLOWING:" ↓);
FOR I← 1 TIL MAXLEN DO
OUTSTR("(" & CVS(I) & ")" ∂ CVS(LEN[I]) ∂ " ");
OUTSTR(NULL ↓ ↓ & "TYPE RETURN TO LEAVE THEM THIS WAY." ↓);
OUTSTR("OTHERWISE, TYPE <TABLE NUMBER><SPACE><NEW ALLOCATION><CARRIAGE-RETURN>" ↓);
OUTSTR("FOR EACH ONE YOU WISH TO CHANGE. TERMINATE WITH A CARRIAGE-RETURN." ↓);
WHILE (S ← GET_A_STRING(NULL)) DO LEN[INTSCAN(S,BRK)] ← INTSCAN(S,BRK);
SYNINP← "SYNONM.ALF[PAR,RCP]"; SYNOUT← "SYNONM.PAR[PAR,RCP]";
SPTINP← "SPATS.SEL[PAR,RCP]"; SPTOUT← "SPATS.PAR[PAR,RCP]";
CPTINP← "CPATS.SEL[PAR,RCP]"; CPTOUT← "CPATS.PAR[PAR,RCP]";
EXCOUT← "SETUP.ERR";
DLKINP← "PDATX[PAR,BLF]"; DLKOUT← "PDATX.PAR[PAR,BLF]";
OUTSTR("THE FOLLOWING FILES ARE DEFAULT:" ↓);
OUTSTR(" SYNONYMS: INPUT=" ∂ SYNINP & ", OUTPUT=" ∂ SYNOUT ↓);
OUTSTR(" S-PATS: INPUT=" ∂ SPTINP & ", OUTPUT=" ∂ SPTOUT ↓);
OUTSTR(" C-PATS: INPUT=" ∂ CPTINP & ", OUTPUT=" ∂ CPTOUT ↓);
OUTSTR(" DSKLOCS: INPUT=" ∂ DLKINP & ", OUTPUT=" ∂ DLKOUT ↓);
OUTSTR(" EXCEPTIONS FILE:" ∂ EXCOUT ↓ ↓);
OUTSTR("TYPE CARRIAGE-RETURN IF THESE ARE DESIRED." ↓);
OUTSTR("OTHERWISE, TYPE <ONE OF SYI,SYO,SPI,SPO,CPI,CPO,DLI,DLO,EXC><SPACE><NEW FILE>" ↓);
OUTSTR("TO CHANGE THEM. TYPE <CARRIAGE-RETURN> TO STOP." ↓);
SETBREAK(1," ",NULL,"INS");
WHILE (S ← GET_A_STRING(NULL)) DO
BEGIN
S← S & " "; F← SCAN(S,1,BRK); V← SCAN(S,1,BRK);
IF EQU(F,"SYI") THEN SYNINP← V
ELSE IF EQU(F,"SYO") THEN SYNOUT← V
ELSE IF EQU(F,"SPI") THEN SPTINP← V
ELSE IF EQU(F,"SPO") THEN SPTOUT← V
ELSE IF EQU(F,"CPI") THEN CPTINP← V
ELSE IF EQU(F,"CPO") THEN CPTOUT← V
ELSE IF EQU(F,"DLI") THEN DLKINP← V
ELSE IF EQU(F,"DLO") THEN DLKOUT← V
ELSE IF EQU(F,"EXC") THEN EXCOUT← V
END;
OUTSTR("THE TABLES ARE ASSUMED TO BE SORTED BY ASCII ORDERING." ↓);
BEGIN
INTEGER ARRAY P1[1:LEN[1],0:1],
P2[1:LEN[2],0:2],
P3[1:LEN[3],0:3],
P4[1:LEN[4],0:4],
P5[1:LEN[5],0:5],
P6[1:LEN[6],0:6],
P7[1:LEN[7],0:7],
P8[1:LEN[8],0:8],
P9[1:LEN[9],0:9],
P10[1:LEN[10],0:10];
PROC CLEAR;
BEGIN
INTEGER I;
FOR I ← 1 TIL MAXLEN DO COUNT[I]← 0
END;
PROC EXCEP(STRING X);
BEGIN
IF TRACE THEN
BEGIN
OUTSTR(" ***EXCEPTION*** " ↓);
OUTSTR(" " & X ↓);
END;
OUT_LINE(X)
END;
PROC OVFL;
BEGIN
OUTSTR("TABLE" ∂ CVS(P) ∂ "HAS OVERFLOWED. RAISE ITS ALLOCATION!" ↓);
GOTO EXIT
END;
PROC PUT(INTEGER ARRAY A);
BEGIN
INTEGER I,N;
N ← COUNT[P]+1;
IF N > LEN[P] THEN OVFL
ELSE FOR I← 1 TIL P DO
A[N,I]← PATTERN[I];
A[N,0]← VAL;
COUNT[P]← N
END;
PROC PLACE;
CASE P-1 OF
BEGIN
PUT(P1);
PUT(P2);
PUT(P3);
PUT(P4);
PUT(P5);
PUT(P6);
PUT(P7);
PUT(P8);
PUT(P9);
PUT(P10)
END;
PROC SPLITUP(STRING X);
BEGIN
INTEGER I,L;
P ← 0;
L ← LENGTH(X);
IF L ≤ MAXLEN*5 THEN FOR I← 1 STEP 5 UNTIL L DO
PATTERN[(P ← P+1)]← CVASC(X[I FOR 5]);
END;
PROC GATHER;
BEGIN
STRING U;
P ← 0;
DO BEGIN
U ← SCAN(S,6,BRK);
P ← P+1;
IF P > MAXLEN THEN BEGIN P←0; BRK← ")" END
ELSE PATTERN[P]← CVASC(U)
END
UNTIL BRK = ")"
END;
INTEGER PROC WRITE(STRING FILE);
BEGIN
INTEGER AD,I;
INTEGER ARRAY ADR[0:127];
INTEGER PROC WR(INTEGER ARRAY A);
BEGIN
INTEGER VAD,J,K;
VAD← AD+COUNT[I]*I+1;
VAD← VAD LOR (COUNT[I] LSH 18);
WORDOUT(OUCH2,VAD);
FOR K← 1 TIL I DO
FOR J← 1 TIL COUNT[I] DO WORDOUT(OUCH2,A[J,K]);
WORDOUT(OUCH2,0);
FOR J← 1 TIL COUNT[I] DO WORDOUT(OUCH2,A[J,0]);
RETURN(COUNT[I]*(I+1)+2)
END;
ENTER(OUCH2,FILE,FLAG);
FOR I← 0 TIL 127 DO ADR[I]← 0;
AD← 1;
FOR I← 1 TIL MAXLEN DO
IF COUNT[I] > 0 THEN
BEGIN
ADR[I]← AD;
AD← AD + COUNT[I]*(I+1)+2
END
ELSE ADR[I]← 0;
ADR[MAXLEN+1]← AD;
ARRYOUT(OUCH2,ADR[0],128);
AD← 1;
WORDOUT(OUCH2,0);
FOR I← 1 TIL MAXLEN DO
IF COUNT[I] > 0 THEN AD← AD + (CASE I-1 OF
(WR(P1), WR(P2), WR(P3), WR(P4), WR(P5),
WR(P6), WR(P7), WR(P8), WR(P9), WR(P10)));
CLOSE(OUCH2);
RETURN(ADR[MAXLEN+1])
END;
PROC DUMP;
BEGIN
INTEGER I;
OUTSTR("(");
FOR I ← 1 TIL P DO
OUTSTR(CVSTR(PATTERN[I]) & " ");
OUTSTR(") →" ∂ CVSTR(VAL) ↓);
END;
PROC TABLES(STRING IFILE,OFILE; BOOLEAN MODE);
BEGIN
INTEGER CH;
CLEAR;
FILIN(IFILE, CH);
BREAK_LINE;
BREAK_BLANK;
SETBREAK(3,"(",NULL,"INA");
SETBREAK(4,")","(","INS");
SETBREAK(5," )",NULL,"INS");
SETBREAK(6," )","(","INS"); α THIS TABLE USED BY GATHER;
OUTSTR("READING FROM FILE" ∂ IFILE ↓ ↓);
WHILE INPUT(CH,3) DO
BEGIN
S← T← INPUT(CH,1);
IF MODE THEN SPLITUP(SCAN(S,2,BRK))
ELSE BEGIN GATHER; SCAN(S,2,BRK) END;
VAL← CVASC(SCAN(S,5,BRK)[1 FOR 5]);
IF (BRK = " " ∧ MODE) ∨ P = 0 THEN EXCEP("(" & T)
ELSE BEGIN
PLACE;
IF TRACE THEN DUMP
END;
END;
SUBTOT← WRITE(OFILE);
TOTAL← TOTAL+SUBTOT;
OUTSTR("END OF FILE" ∂ IFILE ↓);
OUTSTR(OFILE ∂ "TABLES OCCUPY" ∂ CVS(SUBTOT) ∂ "WORDS." ↓)
END;
PROC DSKLOC(STRING IFILE,OFILE);
BEGIN
INTEGER CH,I;
CLEAR;
FILIN(IFILE, CH);
SETBREAK(1,"(",NULL,"INA");
SETBREAK(2, "." & LF, CR & " )", "INS");
OUTSTR("READING FROM FILE" ∂ IFILE ↓ ↓);
P ← 1;
WHILE INPUT(CH,1) DO
BEGIN
PATTERN[1]← CVASC(INPUT(CH,2));
S← INPUT(CH,2);
VAL← 0;
FOR I← 1 TIL LENGTH(S) DO VAL← (VAL LSH 3)+S[I FOR 1]-"0";
PLACE;
IF TRACE THEN OUTSTR("(" & CVSTR(PATTERN[1]) ∂ "." ∂ S & ")" ↓)
END;
OUTSTR("END OF FILE" ∂ IFILE ↓);
SUBTOT← WRITE(OFILE);
TOTAL← TOTAL+SUBTOT;
OUTSTR(OFILE ∂ "TABLES OCCUPY" ∂ CVS(SUBTOT) ∂ "WORDS." ↓)
END;
OUTSTR("WHICH TABLES DO YOU WANT CONSTRUCTED?" ↓);
OUTSTR("(<CARRIAGE RETURN> FOR ALL, OR SOME COMBINATION OF NUMBERS:" ↓);
S ← GET_A_STRING(" 1 FOR SYNONYMS, 2 FOR SPATS, 3 FOR CPATS, 4 FOR DSKLOCS)");
IF S = NULL THEN TASK[5]← TRUE ELSE
FOR I← 1 TIL LENGTH(S) DO
BEGIN J← S[I FOR 1]-"0";
IF J≤4 ∧ J≥1 THEN TASK[J]← TRUE
END;
S ← GET_A_STRING("DO YOU WANT TO WATCH THE INPUT AS IT IS READ");
TRACE ← (S = "Y");
OPEN(OUCH2,"DSK",'10,0,2,0,0,EOF);
FILOUT(EXCOUT, OUCH1);
IF TASK[5]∨TASK[1] THEN TABLES(SYNINP,SYNOUT,TRUE);
IF TASK[5]∨TASK[2] THEN TABLES(SPTINP,SPTOUT,FALSE);
IF TASK[5]∨TASK[3] THEN TABLES(CPTINP,CPTOUT,FALSE);
IF TASK[5]∨TASK[4] THEN DSKLOC(DLKINP,DLKOUT);
RELEASE(OUCH2); RELEASE(OUCH1);
OUTSTR(NULL ↓ ↓ & "TOTAL TABLE SPACE REQUIREMENT IS" ∂ CVS(TOTAL) ∂ "WORDS." ↓);
OUTSTR("THIS IS" ∂ CVOS(TOTAL) ∂ "OCTAL." ↓ ↓);
OUTSTR("EXCEPTIONS HAVE BEEN RECORDED ON FILE" ∂ EXCOUT ↓);
END;
EXIT:;
END